package com.easonji.common.util;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalUnit;
import java.util.Date;

/**
 * @ClassName: DateUtils
 * @Description: 时间工具类
 * @Author: LiuJun
 * @date: 2018/07/12 15:40
 * @Version: 1.0
 * @Copyright: Copyright (c) 2018 - 2019
 */
public class DateUtils {

    /**
     * 毫秒
     */
    public final static long MS = 1;

    /**
     * 每秒钟的毫秒数
     */
    public final static long SECOND_MS = MS * 1000;

    /**
     * 每分钟的毫秒数
     */
    public final static long MINUTE_MS = SECOND_MS * 60;

    /**
     * 每小时的毫秒数
     */
    public final static long HOUR_MS = MINUTE_MS * 60;

    /**
     * 每天的毫秒数
     */
    public final static long DAY_MS = HOUR_MS * 24;

    /**
     * 标准日期格式
     */
    public final static String NORM_DATE_PATTERN = "yyyy-MM-dd";

    /**
     * 标准时间格式
     */
    public final static String NORM_TIME_PATTERN = "HH:mm:ss";

    /**
     * 标准日期时间格式，精确到分
     */
    public final static String NORM_DATETIME_MINUTE_PATTERN = "yyyy-MM-dd HH:mm";

    /**
     * 标准日期时间格式，精确到秒
     */
    public final static String NORM_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    /**
     * 标准日期时间格式，精确到毫秒
     */
    public final static String NORM_DATETIME_MS_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";

    /**
     * 字符串转Date
     * 
     * @param str
     *            时间字符串
     * @param pattern
     *            时间格式
     * @return
     */
    public static java.sql.Date convertStrToDate(String str, String pattern) {
        DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern);
        LocalDate ld = LocalDate.parse(str, df);
        return new java.sql.Date(convertLDToDate(ld).getTime());
    }

    /**
     * java.sql.Date转字符串
     * 
     * @param date
     *            时间
     * @param pattern
     *            时间格式
     * @return
     */
    public static String convertDateToStr(java.sql.Date sqlDate, String pattern) {
        Date date = new Date(sqlDate.getTime());
        LocalDate localDate = convertDateToLD(date);
        return formatTime(localDate, pattern);
    }

    /**
     * Date转字符串
     * 
     * @param date
     *            时间
     * @param pattern
     *            时间格式
     * @return
     */
    public static String convertDateToStr(Date date, String pattern) {
        LocalDate localDate = convertDateToLD(date);
        return formatTime(localDate, pattern);
    }

    /**
     * Date转换为LocalDateTime
     * 
     * @param date
     *            时间对象
     * @return LocalDateTime
     */
    public static LocalDateTime convertDateToLDT(Date date) {
        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
    }

    /**
     * Date转换为LocalDateTime
     * 
     * @param date
     *            时间对象
     * @return LocalDateTime
     */
    public static LocalDate convertDateToLD(Date date) {
        Instant instant = date.toInstant();
        return instant.atZone(ZoneId.systemDefault()).toLocalDate();
    }

    /**
     * LocalDateTime转换为Date
     * 
     * @param time
     *            LocalDateTime
     * @return Date对象
     */
    public static Date convertLDTToDate(LocalDateTime time) {
        return Date.from(time.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * LocalDateTime转换为Date
     * 
     * @param time
     *            LocalDateTime
     * @return Date对象
     */
    public static Date convertLDToDate(LocalDate time) {
        ZonedDateTime zdt = time.atStartOfDay(ZoneId.systemDefault());
        return Date.from(zdt.toInstant());
    }

    /**
     * 获取指定时间的指定格式
     * 
     * @param time
     *            时间
     * @param pattern
     *            时间格式
     * @return 时间字符串
     */
    public static String formatTime(LocalDateTime time, String pattern) {
        return time.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 获取指定时间的指定格式
     * 
     * @param time
     *            时间
     * @param pattern
     *            时间格式
     * @return 时间字符串
     */
    public static String formatTime(LocalDate date, String pattern) {
        return date.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 获取当前时间的指定格式
     * 
     * @param pattern
     *            日期格式
     * @return 时间字符串
     */
    public static String formatNow(String pattern) {
        return formatTime(LocalDateTime.now(), pattern);
    }

    /**
     * 日期加上一个数
     * 
     * @param time
     *            时间
     * @param number
     *            大小
     * @param field
     *            类型
     * @return 时间
     */
    public static LocalDateTime plus(LocalDateTime time, long number, TemporalUnit field) {
        return time.plus(number, field);
    }

    /**
     * 日期减去一个数
     * 
     * @param time
     *            时间
     * @param number
     *            大小
     * @param field
     *            类型
     * @return 时间
     */
    public static LocalDateTime minu(LocalDateTime time, long number, TemporalUnit field) {
        return time.minus(number, field);
    }
}
